#ifndef _RTF_CAL_H_
#define _RTF_CAL_H_

#ifdef __cplusplus 
extern "C"
{ 
#endif

#include "nui_things/HAL/include/platform_define.h"

#if !defined(PLATFORM_DEFINE) || (PLATFORM_DEFINE==LINUX) || (PLATFORM_DEFINE==YOC)
#include <sys/time.h>
#elif (PLATFORM_DEFINE==SC5654A)

#endif

typedef struct rtf_cal_handle_{
	//time in us
	char name[32];

	int cal_first;//first called, init the min/max
	//float time_average;
	//unsigned int time_max;
	//unsigned int time_min;

	
	int total_cal_first;// 是否是总统计中的第一次，只有init的时候为1.
	//unsigned int total_time_max;
	//unsigned int total_time_min;
	
	unsigned int count;
	//unsigned int time_all;

	float rtf_once;     //rtf当前帧瞬时值
	float rtf_average;  //rtf平均值， 从reset开始
	float rtf_min;      //rtf最小值， 从reset开始
	float rtf_max;      //rtf最大值， 从reset开始
	float rtf_total_min;//rtf最小值， 从init开始
	float rtf_total_max;//rtf最大值， 从init开始
		
#if !defined(PLATFORM_DEFINE) || (PLATFORM_DEFINE==LINUX) || (PLATFORM_DEFINE==YOC)
	struct timeval start_timestamp;
	struct timeval stop_timestamp;
#elif (PLATFORM_DEFINE==SC5654A)
	unsigned int start_timestamp;
	unsigned int  stop_timestamp;
#endif

}rtf_cal_handle;

/* int rtf_cal_init(rtf_cal_handle * handle, const char * name) 
	初始化已有句柄。 成功返回0. 不存在内存申请
	name 字符串标识，不同应用使用不同字符串，长度<32
*/
int rtf_cal_init(rtf_cal_handle * handle, const char * name);

/* void rtf_cal_start_timestamp(rtf_cal_handle * handle) 
	获取句柄的起始时间
*/
void rtf_cal_start_timestamp(rtf_cal_handle * handle);

/* int rtf_cal_stop_timestamp_just(rtf_cal_handle * handle) 
	获取句柄的结束时间，并返回 结束时间与起始时间的时间差，单位us
	*用于只计算时间差的场景
*/
int rtf_cal_stop_timestamp_just(rtf_cal_handle * handle);


/*
	int rtf_cal_stop_timestamp(rtf_cal_handle * handle, int data_length_us)
	获取当前结束时间，并计算 本次start到 stop的瞬时时间间隔，单位为us，并返回。
	同时统计RTF 均值、区间最大值、区间最小值、所有最大值、所有最小值中。
	data_length_us 是本次start-stop之间的处理数据长度，单位us
	*用于计算时间差、并统计rtf的场景
*/
int rtf_cal_stop_timestamp(rtf_cal_handle * handle, int data_length_us);

/* void rtf_cal_reset(rtf_cal_handle * handle);
	重置阶段性统计信息，开启下一阶段的统计。
	在累计到 rtf_cal_get_interval() 时调用一次 rtf_cal_print() ，然后调用rtf_cal_reset() 开启新一阶段的统计过程。
*/
void rtf_cal_reset(rtf_cal_handle * handle);

/* int rtf_cal_get_interval() 
	获取推荐的统计次数。比如 100次，start、stop 100次后 调用rtf_cal_print() 打印一次统计信息。
*/
int rtf_cal_get_interval();

/* void rtf_cal_print(rtf_cal_handle * handle, const char * characteristic);
	打印一次统计信息.
	handle: 句柄
	characteristic： 区分不同模块的字符串，会打印出来，方便log中进行分析。 比如[fe] [kws]
	log输出格式：
	"RTFCAL: [%s] rtf:%.3f aver:%.3f stage_min:%.3f  stage_max:%.3f total_min:%.3f  total_max:%.3f []"
	
*/
void rtf_cal_print(rtf_cal_handle * handle);

#ifdef __cplusplus 
}
#endif

#endif /* _RTF_CAL_H_ */
